<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>类的基本知识</title>
</head>

<body>
    <script>
        /*
           类中构造器不是必须写的 要对实例进行一些初始化操作 如添加指定属性时才写
           如过a类继承了b类 且a中写了构造器 那么a类构造器中super是必须要调用的
           类中所定义的方法都是放在类的原型对象上
        */

        //创建类
        class Person {
            //构造器方法
            constructor(name, age) {
                //构造器中的this是 ---类的实例对象
                this.name = name
                this.age = age
            }
            //一般方法(除构造器以外的方法)
            speak() {
                //speak方法放在了Person类中的原型对象上 prototype 供实例使用
                //通过Person实例调用speak时,speak()中的this就是Person实例
                console.log(`这个人是${this.name},年龄是${this.age}`);//带$指向构造器中的属性
            }
        }
        //创建一个实例对象

        /*const p1 = new Person('tom', 18)//在这行this指向p1
        const p2 = new Person('xinyaun', 25)//在这行this指向p2
        console.log(p1);
        console.log(p2);
        p1.speak()
        p2.speak()*/

        //创建一个Student类继承于Person类
        class Student extends Person {
            //因为继承于Person类 所以不需要使用构造器接收参数
            constructor(name, age, grade) {
                super(name, age)//给父类传参 必须放在所有参数之前
                this.grade = grade
            }
            //重写从父类继承过来的方法
            speak() {
                console.log(`这个人是${this.name},年龄是${this.age},我得了${this.grade}`);
            }
            study() {
                //study方法放在了Student类中的原型对象上 prototype 供Student实例使用
                //通过Student实例调用study时,study()中的this就是Student实例
                console.log('不学无术');
            }
        }
        class Car {
            constructor(name, price) {
                this.name = name
                this.price = price
            }
            //类中可以直接写赋值语句,给car的实例对象添加一个属性 名为a 值为1
            a = 1
            //直接给类本身添加属性
            static wheel = 4
        }
        const s1 = new Student('小王', 18, '梅毒')
        const c1 = new Car('k', 21)
        console.log(c1);
        console.log(Car.wheel)
        console.log(s1)

    </script>
</body>

</html>